home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / RAVE SDK 1.5 MacOS / RaveDemo / MyMatrixMath.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-14  |  3.2 KB  |  170 lines  |  [TEXT/CWIE]

  1. #include "MyHeader.h"
  2.  
  3. static MyMatrix unit = {
  4.     1, 0, 0,
  5.     0, 1, 0,
  6.     0, 0, 1,
  7.     0, 0, 0
  8. };
  9.  
  10. void MyMatrixClear(MyMatrix * m1)
  11. {
  12.     *m1 = unit;    
  13. }
  14.  
  15. void MyMatrixCat(MyMatrix * m1, MyMatrix * m2, MyMatrix * m3)
  16. {
  17.     MyMatrix mt;
  18.     
  19.     MyMatrixRotateVector(m2, &m1->x, &mt.x);
  20.     MyMatrixRotateVector(m2, &m1->y, &mt.y);
  21.     MyMatrixRotateVector(m2, &m1->z, &mt.z);
  22.     MyMatrixTransformVector(m2, &m1->w, &mt.w);
  23.     
  24.     *m3 = mt;
  25. }
  26.  
  27. void MyMatrixRotateByMatrix(MyMatrix * m1, MyMatrix * m2)
  28. {
  29.     MyVector temp;
  30.     static const MyVector zeroVector = {0, 0, 0};
  31.     
  32.     temp = m1->w;
  33.     
  34.     m1->w = zeroVector;
  35.  
  36.     MyMatrixCat(m1, m2, m1);
  37.     
  38.     m1->w = temp;
  39. }
  40.  
  41. void MyMatrixTransformVector(MyMatrix * m1, MyVector * v1, MyVector * v2)
  42. {
  43.     MyVector vt;
  44.     
  45.     vt.x = m1->x.x * v1->x + m1->y.x * v1->y + m1->z.x * v1->z + m1->w.x;
  46.     vt.y = m1->x.y * v1->x + m1->y.y * v1->y + m1->z.y * v1->z + m1->w.y;
  47.     vt.z = m1->x.z * v1->x + m1->y.z * v1->y + m1->z.z * v1->z + m1->w.z;
  48.     
  49.     *v2 = vt;
  50. }
  51.  
  52. // does not translate the vector by the w value
  53. void MyMatrixRotateVector(MyMatrix * m1, MyVector * v1, MyVector * v2)
  54. {
  55.     MyVector vt;
  56.     
  57.     vt.x = m1->x.x * v1->x + m1->y.x * v1->y + m1->z.x * v1->z;
  58.     vt.y = m1->x.y * v1->x + m1->y.y * v1->y + m1->z.y * v1->z;
  59.     vt.z = m1->x.z * v1->x + m1->y.z * v1->y + m1->z.z * v1->z;
  60.     
  61.     *v2 = vt;
  62. }
  63.  
  64. void MyMatrixSetRotateX(float theta, MyMatrix * m1)
  65. {
  66.     *m1 = unit;
  67.     m1->y.y = m1->z.z = cos(theta);
  68.     m1->z.y = -(m1->y.z = sin(theta));
  69. }
  70.  
  71. void MyMatrixSetRotateY(float theta, MyMatrix * m1)
  72. {
  73.     *m1 = unit;
  74.     m1->x.x = m1->z.z = cos(theta);
  75.     m1->x.z = -(m1->z.x = sin(theta));
  76. }
  77.  
  78. void MyMatrixSetRotateZ(float theta, MyMatrix * m1)
  79. {
  80.     *m1 = unit;
  81.     m1->y.y = m1->x.x = cos(theta);
  82.     m1->y.x = -(m1->x.y = sin(theta));
  83. }
  84.  
  85. void MyMatrixNegate(MyMatrix * m1, MyMatrix * m2)
  86. {
  87.     m2->w.x = m1->x.x * -m1->w.x + m1->x.y * -m1->w.y + m1->x.z * -m1->w.z;
  88.     m2->w.y = m1->y.x * -m1->w.x + m1->y.y * -m1->w.y + m1->y.z * -m1->w.z;
  89.     m2->w.z = m1->z.x * -m1->w.x + m1->z.y * -m1->w.y + m1->z.z * -m1->w.z;
  90.  
  91.     m2->x.x = m1->x.x;
  92.     m2->x.y = m1->y.x;
  93.     m2->x.z = m1->z.x;
  94.  
  95.     m2->y.x = m1->x.y;
  96.     m2->y.y = m1->y.y;
  97.     m2->y.z = m1->z.y;
  98.  
  99.     m2->z.x = m1->x.z;
  100.     m2->z.y = m1->y.z;
  101.     m2->z.z = m1->z.z;
  102.  
  103. }
  104.  
  105. void MyMatrixScaleLocal(MyMatrix * m1, float scaleFactor, MyMatrix * m2)
  106. {
  107.     m2->x.x = m1->x.x * scaleFactor;
  108.     m2->x.y = m1->x.y * scaleFactor;
  109.     m2->x.z = m1->x.z * scaleFactor;
  110.  
  111.     m2->y.x = m1->y.x * scaleFactor;
  112.     m2->y.y = m1->y.y * scaleFactor;
  113.     m2->y.z = m1->y.z * scaleFactor;
  114.  
  115.     m2->z.x = m1->z.x * scaleFactor;
  116.     m2->z.y = m1->z.y * scaleFactor;
  117.     m2->z.z = m1->z.z * scaleFactor;
  118.  
  119. }
  120.  
  121.  
  122.  
  123. /**************************************/
  124.  
  125. static void MyMatrixPrint(MyMatrix * m1)
  126. {
  127.     printf("\n%f, %f, %f\n", m1->x.x, m1->x.y, m1->x.z);
  128.     printf("%f, %f, %f\n", m1->y.x, m1->y.y, m1->y.z);
  129.     printf("%f, %f, %f\n", m1->z.x, m1->z.y, m1->z.z);
  130.     printf("%f, %f, %f\n", m1->w.x, m1->w.y, m1->w.z);
  131. }
  132.  
  133. void mtest(void)
  134. {
  135.     MyMatrix m1, m2;
  136.     char s[256];
  137.     float xr, yr;
  138.     
  139.     double pi;
  140.     
  141.     /*****/
  142.     
  143.     pi = atan(1) * 4;
  144.     
  145.     printf("pi = %20.15f\n", pi);
  146.     
  147.     printf("enter x rotation");
  148.     scanf("%f", &xr);
  149.     printf("\nenter y rotation");
  150.     scanf("%f", &yr);
  151.     printf("\n");
  152.     
  153.     MyMatrixSetRotateX(xr, &m1);
  154.     MyMatrixPrint(&m1);
  155.  
  156.     MyMatrixSetRotateY(yr, &m2);
  157.     MyMatrixPrint(&m2);
  158.     
  159.     MyMatrixCat(&m1, &m2, &m1);
  160.     MyMatrixPrint(&m1);
  161.  
  162.     gets(s);    
  163.  
  164. }
  165.  
  166.  
  167.  
  168.  
  169.  
  170.